import router from '@/router'
import store from '@/store'
import asyncRoutes from '@/router/asyncRoutes'
// 设置未登录可以访问页面的白名单
const whiteList = ['/login', '/404']

// 筛选一级路由
function getFirstPermission (permission) {
  const firstArr = permission.map(item => {
    return item.split(':')[0]
  })
  // 去重
  return Array.from(new Set(firstArr))
}

// 筛选二级路由
function getSecondPermission (permission) {
  const secondArr = permission.map(item => {
    const arr = item.split(':')
    return `${arr[0]}:${arr[1]}`
  })
  // 去重
  return Array.from(new Set(secondArr))
}

// 根据一级路由和二级路由，筛选可展示的动态路由
function getRoutes (firstPermission, secondPermission, asyncRoutes) {
  // 如果是管理员用户，就不用进行筛选
  if (firstPermission.includes('*')) {
    return asyncRoutes
  }
  const firstRoutes = asyncRoutes.filter(item =>
    firstPermission.includes(item.permission)
  )
  const routes = firstRoutes.map(item => {
    return {
      ...item,
      children: item.children.filter(child =>
        secondPermission.includes(child.permission)
      )
    }
  })
  return routes
}

// 设置路由守卫
router.beforeEach(async (to, from, next) => {
  // to：跳转的路由对象
  // from：从哪里来
  // next：放行next() 重定向next(路径)
  const token = store.state.user.token
  if (token) {
    // 如果有token
    if (to.path === '/login') {
      // 如果有token，且访问登录页面，则跳转至首页
      next('/')
    } else {
      // 有token，访问其他路径，直接放行
      next()
      // 获取权限信息，存在vuex中
      const permission = await store.dispatch('menu/getPermission')
      // 根据权限标识，筛选一级路由
      const firstPermission = getFirstPermission(permission)
      console.log('firstPermission', firstPermission)
      // 根据权限标识，筛选二级路由
      const secondPermission = getSecondPermission(permission)
      console.log('secondPermission', secondPermission)
      // 根据标识筛选路由
      const routes = getRoutes(firstPermission, secondPermission, asyncRoutes)
      console.log(routes)
      // 筛选的路由渲染到左侧
      // 把筛选后的路由添加到路由对象中可以跳转
      routes.forEach(route => router.addRoute(route))
      // 再把筛选后的路由添加到vuex中（渲染）
      store.commit('menu/setMenuList', routes)
    }
  } else {
    if (whiteList.includes(to.path)) {
      // 没有token，访问白名单，直接放行
      next()
    } else {
      // 没有token，访问其他页面，跳转登录
      next('/login')
    }
  }
})
